package com.eddie.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * ConcreteSubject：具体主题（具体被观察者），该角色将有关状态存入具体观察者对象，在具体主题的内部状态发生改变时，给所有注册过的观察者发送通知。
 * 核心类
 * 1.包含最新的天气情况信息
 * 2.含有观察者集合，使用ArrayList管理
 * 3.当数据有更新时，就主动调用，通知所有的（接入方）就看到最新的信息
 *
 * @author Eddie
 * @date 2022/08/04 09:39
 **/
public class WeatherData implements Subject {

    private float temperature;
    private float pressure;
    private float humidity;
    //聚合第三方,为集合
    private List<Observer> observers;

    public WeatherData() {
        this.observers = new ArrayList<>();
    }

    //当数据有更新时，就调用notifyObserver
    public void setData(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        notifyObserver();
    }

    //注册方法，将第三方加入到第三方集合中
    @Override
    public void registerObserver(Observer observer) {
        this.observers.add(observer);
    }

    //删除方法，将第三方从第三方集合删除
    @Override
    public void removeObserver(Observer observer) {
        this.observers.remove(observer);
    }

    //所有第三方通知方法
    @Override
    public void notifyObserver() {
        //forEach循环遍历所有第三方，通过Lambda表达式循环每一个第三方并调用其update方法
        this.observers.forEach(item -> item.update(this.temperature, this.pressure, this.humidity));
    }
}
